#include "data_cache.h"

sp_recv_data_cache cache;

/**
 * @brief 向缓存中写入数据（通常由中断服务程序调用，如UART接收中断）
 * @param dat：待写入的单字节数据
 * @note 逻辑：若缓存未满，则将数据存入缓存数组，更新缓存长度；若已满，打印提示
 */
void recv_data_cache_input(uint8_t dat)
{
    // 检查缓存是否有空闲空间（ptr < 最大缓存大小）
    if (cache.ptr < SP_RECV_DATA_CACHE_SIZE) {
        cache.dat[cache.ptr++] = dat;
    } else {
        printf("cache full!\r\n");
    }
}

/**
 * @brief 从缓存中读取数据（通常由应用任务调用，如Shell任务）
 * @param dat：用于存储读取结果的指针（输出参数）
 * @note 逻辑：若缓存非空，则取出第一个数据，后续数据前移，更新缓存长度；若为空，打印提示
 */
void recv_data_cache_output(uint8_t* dat)
{
    // 检查缓存是否有数据（ptr > 0表示至少有1字节数据）
    if (cache.ptr > 0) {
        // 读取缓存中的第一个数据（索引0）
        *dat = cache.dat[0];
        // 将后续数据整体前移1位（覆盖已读取的数据），保持缓存数组连续
        memmove(&cache.dat[0], &cache.dat[1], cache.ptr - 1);
        // 缓存长度减1（ptr自减）
        cache.ptr--;
    } else {
        // 缓存为空，打印提示（实际应用中可忽略或做容错处理）
        printf("cache empty!\r\n");
    }
}

/**
 * @brief 初始化数据缓存（系统启动时调用）
 * @note 功能：初始化缓存状态（如ptr=0）、创建互斥锁（当前注释）
 */
void data_cache_init(void)
{
}
